OBJETIVO: Presentación y breve panorama de lo que haremos las próximas semanas
Recomendación como en todo, dejen a un lado los paradigmas, cosas que han escuchado, leído en diversos medios, y preparense para tener una mente dispuesta.
Clear your minds!!!
Hay que ubicarnos en donde estamos en base a lo que hacemos actualmente. No todo lo que hacemos hoy esta mal, pero hay aún mas cosas que aprender.
Dónde estamos?
La generación e ingesta de datos hoy es una necesidad, debemos contar con mejores herramientas para el manejo de los mismos. Es muy util en nuestras vidas se consumidores, pero mucho mejor ser generadores y controladores de ellos.
Datos everywhere!
Debemos de empezar por algo, los diferentes lenguajes de programación y otras herramientas denominadas Open Source son un excelente comienzo!!
Python y R para empezar
Necesitamos ver el ecosistema, nuestra realidad y tomar la mejor decisión para ver por donde empezamos, todos los lenguajes son utiles, pero no podemos saberlo todo.
Ecosistema de R
Python y R ya como un mismo lenguaje, es donde vemos el terreno que ha ganado R, Markdown y otras herramientas al apoyarse en un magnífico lenguaje.
R y Python una maravilla!
R es un lenguaje muy usado para la enseñanza, cada vez mas universidades lo usan como herramienta para estadística y otras áreas, chequen este articulo. http://r4stats.com/articles/popularity/
Dudas del Open Source, revisen el siguiente Link https://www.gnu.org/licenses/quick-guide-gplv3.html y naveguen.
OBJETIVO: Breve historia de R y contexto
Ross Ihaka and Robert Gentleman desarrollaron R como un software free cuando impartían clases en la Universidad de Auckland en New Zealand a principios de 1990.
Lo crearon a partir del lenguaje estadístico denominado S y para diferenciar su trabajo usaron una sintaxis similar para su propio uso. En 1993 anunciaron su colaboración en las noticias del mailing list de S, muchas personas se interesaron y se sumaron a la colaboración. Dicha colaboración sigue en pie en el sitio https://www.r-project.org/
El lanzamiento oficial (1.0.0) fue en Febrero del 2000, para ese entonces ya era parte de la fundación de software libre GNU. Actualmente la última versión (3.6) está disponible desde Abril de este año para más de 30 países.
Es un software que ayuda a la manipulación de datos, cálculos aritméticos y visualización de gráficos dinámicos.
El código es de fácil escritura y comprensión.
Excelente para el cálculo de matrices, vectores, algoritmos complejos.
Existe una colección muy amplia de herramientas para el análisis de datos, visualización y otros propósitos. dplyr, data.table, tidyr y ggplot2 algunos de ellos.
Fácil desarrollo de herramientas con buen nivel de interacción como blogdown y xaringan.
Para descargar e instalar R en su última versión, deberán utilizar el siguiente link https://cran.r-project.org/bin/windows/base/ donde encontraran la versión para Windows que es el sistema operativo que todos tenemos.
Un lenguaje amigable, fácil de usar y entender, simple y efectivo.
Con R se distribuyen algunos paquetes, pero existen muchos más en el sitio CRAN, cubriendo así un amplio espectro de herramientas estadísticas, de cálculo y de visualización que les harán más divertida la vida.
El link con todo el material del curso esta en mi repo personal de Git, tengan cuidado de no aruinarlo, luego hacemos otro curso de Git. https://github.com/ricardolastra/Workshop_Seguros
En los próximos días les hare llegar documentos como estos, los cuales les serán de gran apoyo con cosas básicas, no podemos retener todo en mente, además que no cubriremos muchos comandos, ejemplos y funciones de las paqueterías.
Para las siguientes sesiones usaremos una interface muy “Fancy” denominada RStudio, la cual podrán descargar en el siguiente link https://www.rstudio.com/products/rstudio/download/ que los llevara a tener la versión más reciente 1.2.1335
Existen más programas o UI´s muy padres, Anaconda (luego revisan el siguiente link) https://www.anaconda.com/distribution/ tiene excelentes herramientas con Python y aun para R. Sin embargo una de las mejores herramientas con R es RStudio.
No nos perdemos de mucho, échenle un ojo.
OBJETIVO: Vistazo de Rstudio y primeros comandos
Recordando…
R es un lenguaje computacional diseñado para la estadística.
Recuerden que cualquier cosa que escriban en R muy probablemente no seran los primeros en intentarlo, hay una gran posibilidad que alguien ya haya escrito algun paquete justo para lo que necesitan.
Hecharemos un vistazo a la parte basica de RStudio que nos permitira entender el funcionamiento del lenguaje, sus alcances, sus aplicaciones y sus ventajas sobre las herramientas actuales que conocemos.
Inicien RStudio y abran un R script:
File -> New File -> R scriptFile -> Save As -> ruta a su carpeta y nombre del fileAhora traten de reproducir las siguientes notas.
Nota. Recuerden el simbolo # para comentar su codigo.
FORMAS DE DECLARAR Ó GUARDAR Ó ALMACENAR Ó MANTENER VARIABLES:
x = 3
y <- 4
5 -> z
Asi estan almacenadas en el ambiente:
x
## [1] 3
y
## [1] 4
z
## [1] 5
Nota. Los valores que guardamos pueden ser usados en subsecuentes operaciones, recuerden que lo mas limpio es poner el nombre a la izquierda y los valores a la derecha.
SOBRESCRIBIR VARIABLES:
x = 4
y <- 5
6 -> z
Asi estan almacenadas en el ambiente:
x
## [1] 4
y
## [1] 5
z
## [1] 6
CALCULOS BASICOS:
Operadores
#SUMAS
25+25
## [1] 50
x+y
## [1] 9
#MULTIPLICACIONES
35*2
## [1] 70
#DIVISIONES
x/y
## [1] 0.8
#RESTAS
z-x-y
## [1] -3
#Potencias
3^2
## [1] 9
y^x
## [1] 625
CALCULOS BASICOS
FORMAS DE NO HACER CALCULOS BASICOS, ASI NO ES LA SINTAXIS DE R:
#SUMAS
#=25+25
#MULTIPLICACIONES
#(35)(2)
VECTORES
#Basicos
x <- c(1,4,3,1,3,2,2,2)
x[1]
## [1] 1
x[2]
## [1] 4
x[2:4]
## [1] 4 3 1
x[-1]
## [1] 4 3 1 3 2 2 2
x[-4]
## [1] 1 4 3 3 2 2 2
x[x<=3]
## [1] 1 3 1 3 2 2 2
#Función which (más adelante veremos, for, while, ifelse)
#Devuelve la posición del elemento que pidamos validar.
which(x==1)
## [1] 1 4
#Quizá con el alfabeto es más claro.
which(letters == "g")
## [1] 7
x==1
## [1] TRUE FALSE FALSE TRUE FALSE FALSE FALSE FALSE
#Mas complejos con operaciones, guardamos vectores
Cebollas.huacal <- c(12,4,4,6,9,3)
Chiles.caja <- c(5,3,2,2,12,9)
#Multiplicamos vectores
Cebollas.precio <- Cebollas.huacal *200
Chiles.precio <- Chiles.caja *100
#Sumamos vectores
Cebollas.precio + Chiles.precio
## [1] 2900 1100 1000 1400 3000 1500
#Tambien lo podemos hacer asi en 1 sola linea
Cebollas.huacal *200 + Chiles.caja *100
## [1] 2900 1100 1000 1400 3000 1500
OBJETOS
objeto <- 3*3
FUNCIONES
myfun = function(x, y){
return (x*y)
}
myfun(3,4)
## [1] 12
myfun2 = function(x, n=2){
return(x^n)
}
myfun2(4)
## [1] 16
myfun2(2, n=3)
## [1] 8
R LOOP´S
Sintaxis WHILE:
while (test_expression){ statement }
i <- 1
while (i < 6) {
print(i)
i = i+1
}
## [1] 1
## [1] 2
## [1] 3
## [1] 4
## [1] 5
Sintaxis FOR:
for(var in seq){ expr }
for (año in c(2014,2015,2016,2017,2018,2019)){
print(paste("El año actual es", año))
}
## [1] "El año actual es 2014"
## [1] "El año actual es 2015"
## [1] "El año actual es 2016"
## [1] "El año actual es 2017"
## [1] "El año actual es 2018"
## [1] "El año actual es 2019"
Aún mejor…
for (año in 2014:2019){
print(paste("El año actual es", año))
}
## [1] "El año actual es 2014"
## [1] "El año actual es 2015"
## [1] "El año actual es 2016"
## [1] "El año actual es 2017"
## [1] "El año actual es 2018"
## [1] "El año actual es 2019"
lo ideal…
años <- c(2014,2015,2016,2017,2018,2019)
for (i in años){
print(paste("El año actual es", i))
}
## [1] "El año actual es 2014"
## [1] "El año actual es 2015"
## [1] "El año actual es 2016"
## [1] "El año actual es 2017"
## [1] "El año actual es 2018"
## [1] "El año actual es 2019"
R FUNCTION´S
Sintaxis IFELSE:
ifelse(test, yes, no)
plazo <- c(6,9,12,24,30)
ifelse(plazo==9, "aplica" , "no aplica")
## [1] "no aplica" "aplica" "no aplica" "no aplica" "no aplica"
más divertido…
plazo <- c(6,9,12,24,30)
ifelse(plazo>=9 & plazo<=24, "aplica" , "no aplica")
## [1] "no aplica" "aplica" "aplica" "aplica" "no aplica"
Sintaxis WHICH:
which(x, arr.ind = FALSE, useNames = TRUE)
which(letters == "g")
## [1] 7
Nota. Para más detalles consulten los documentos de apoyo del repo de git en el documento refcard_2.0_operators_others
OBJETIVO: Como cargar datos, paquetes y librerias
Cargando nuestros datos
R tiene algunas formas de leer archivos, los mas comunes son tablas, archivos planos, archivos con alguna codificacion especifica o estructurada. Aunque no sera el objetivo del curso, leer cadenas de texto, datos sin estructuras definidas o espcificas y archivos sin algun tipo de orden, es algo que tambien se puede hacer en R.
Para leer datos de un archivo, primero deben saber que tipo de archivo es, es decir, su extension. La tabla de abajo muestra una lista de funciones que pueden ser importadas segun el formato del archivo.
| tipo de datos | funcion | paquete |
|---|---|---|
| comma separated (.csv) | read_csv() |
readr |
| other delimited formats | read_delim() |
readr |
| R (.Rds) | read_rds() |
readr |
| Stata (.dta) | read_dta() |
haven |
| SPSS (.sav) | read_spss() |
haven |
| SAS (.sas7bdat) | read_sas() |
haven |
| Excel (.xls, .xlsx) | read_excel() |
readxl |
| regular delimited files | fread() |
data.table |
Nota. Mas información ver documento de apoyo data-import
Paqueterias de R ó los famosos packages
Los paquetes de R pueden ser instalados desde el famoso CRAN, el cual es una red de archivos de alta gama. Para ello deberán usar la función install.packages. Cuando instalan un paquete ponen una copia en la computadora de forma local, pero aun no lo hace “usable”, solo esta “disponible”. Para usarlo deberan adjuntar o cargar la funcion de library.
Gracias a nuestro amigo Hadley y otros colaboradores, en este curso usaremos para prueba de carga el famoso “the tidyverse”. Tidyverse nos brinda grandes herramientas para manipulación basica y avanzada de datos, es muy funcional, facíl e intuitiva.
install.packages("tidyverse")
library(tidyverse)
## -- Attaching packages --------------------------------------------------------------------------- tidyverse 1.2.1 --
## v ggplot2 3.1.1 v purrr 0.3.2
## v tibble 2.1.1 v dplyr 0.8.0.1
## v tidyr 0.8.3 v stringr 1.4.0
## v readr 1.3.1 v forcats 0.4.0
## -- Conflicts ------------------------------------------------------------------------------ tidyverse_conflicts() --
## x dplyr::filter() masks stats::filter()
## x dplyr::lag() masks stats::lag()
Nota. Ayuda en R
Podemos usar la función help o el operador al inicio de cada sentencia ?.
#help(help)
#?str
Cargando nuestro primer archivo:
read_csv("bases/PRIMAS_EJE_CARGA.csv")
## Warning: Missing column names filled in: 'X2' [2], 'X3' [3], 'X4' [4],
## 'X5' [5], 'X6' [6], 'X7' [7], 'X8' [8], 'X9' [9], 'X10' [10], 'X11' [11],
## 'X12' [12]
## Parsed with column specification:
## cols(
## `TITULOS FEOS DE REPORTES CLASICOS DE SIISA` = col_character(),
## X2 = col_character(),
## X3 = col_character(),
## X4 = col_character(),
## X5 = col_character(),
## X6 = col_character(),
## X7 = col_character(),
## X8 = col_character(),
## X9 = col_character(),
## X10 = col_character(),
## X11 = col_character(),
## X12 = col_character()
## )
## # A tibble: 23,347 x 12
## `TITULOS FEOS D~ X2 X3 X4 X5 X6 X7 X8 X9 X10
## <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr>
## 1 <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>
## 2 POLIZA ENDO~ ID_C~ PRIMA PATE~ MATE~ NOMB~ NOMB~ SEXO PLAZO
## 3 D00- 201901 1 1 2097~ MURR~ GAREY LETI~ <NA> F 15
## 4 D00- 201901 2 2 3202~ MEZA MEZA OMAR <NA> M 15
## 5 D00- 201901 1 3 6028~ LOPEZ ARAG~ AARON FEDE~ M 21
## 6 D00- 201901 2 4 8425~ CARD~ GUEV~ AARON IVAN M 21
## 7 D00- 201901 1 5 2842~ JAVI~ MARQ~ AARON ALEJ~ M 27
## 8 D00- 201901 2 6 1593~ CAST~ RANG~ AARON <NA> M 9
## 9 D00- 201901 1 7 1403~ GUER~ RODR~ AARON <NA> M 15
## 10 D00- 201901 2 8 3766~ BENC~ RUBIO AARON MART~ M 9
## # ... with 23,337 more rows, and 2 more variables: X11 <chr>, X12 <chr>
UPS!! Problemas!!!
Hagamos que este disponible la libreria…
library(readr)
read_csv("bases/PRIMAS_EJE_CARGA.csv")
## Warning: Missing column names filled in: 'X2' [2], 'X3' [3], 'X4' [4],
## 'X5' [5], 'X6' [6], 'X7' [7], 'X8' [8], 'X9' [9], 'X10' [10], 'X11' [11],
## 'X12' [12]
## Parsed with column specification:
## cols(
## `TITULOS FEOS DE REPORTES CLASICOS DE SIISA` = col_character(),
## X2 = col_character(),
## X3 = col_character(),
## X4 = col_character(),
## X5 = col_character(),
## X6 = col_character(),
## X7 = col_character(),
## X8 = col_character(),
## X9 = col_character(),
## X10 = col_character(),
## X11 = col_character(),
## X12 = col_character()
## )
## # A tibble: 23,347 x 12
## `TITULOS FEOS D~ X2 X3 X4 X5 X6 X7 X8 X9 X10
## <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr>
## 1 <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>
## 2 POLIZA ENDO~ ID_C~ PRIMA PATE~ MATE~ NOMB~ NOMB~ SEXO PLAZO
## 3 D00- 201901 1 1 2097~ MURR~ GAREY LETI~ <NA> F 15
## 4 D00- 201901 2 2 3202~ MEZA MEZA OMAR <NA> M 15
## 5 D00- 201901 1 3 6028~ LOPEZ ARAG~ AARON FEDE~ M 21
## 6 D00- 201901 2 4 8425~ CARD~ GUEV~ AARON IVAN M 21
## 7 D00- 201901 1 5 2842~ JAVI~ MARQ~ AARON ALEJ~ M 27
## 8 D00- 201901 2 6 1593~ CAST~ RANG~ AARON <NA> M 9
## 9 D00- 201901 1 7 1403~ GUER~ RODR~ AARON <NA> M 15
## 10 D00- 201901 2 8 3766~ BENC~ RUBIO AARON MART~ M 9
## # ... with 23,337 more rows, and 2 more variables: X11 <chr>, X12 <chr>
Clasico de SIISA y nuestros amigos de TI!!!
library(readr)
read_csv("bases/PRIMAS_EJE_CARGA.csv", skip = 2)
## Parsed with column specification:
## cols(
## POLIZA = col_character(),
## ENDOSO = col_double(),
## ID_CONS = col_double(),
## PRIMA = col_double(),
## PATERNO = col_character(),
## MATERNO = col_character(),
## NOMBRE = col_character(),
## NOMBRE_2 = col_character(),
## SEXO = col_character(),
## PLAZO = col_double(),
## SEG_SOCIAL = col_double(),
## ID_PROD = col_double()
## )
## # A tibble: 23,345 x 12
## POLIZA ENDOSO ID_CONS PRIMA PATERNO MATERNO NOMBRE NOMBRE_2 SEXO PLAZO
## <chr> <dbl> <dbl> <dbl> <chr> <chr> <chr> <chr> <chr> <dbl>
## 1 D00- ~ 1 1 20975. MURRIE~ GAREY LETIC~ <NA> F 15
## 2 D00- ~ 2 2 32022. MEZA MEZA OMAR <NA> M 15
## 3 D00- ~ 1 3 60285. LOPEZ ARAGON AARON FEDERICO M 21
## 4 D00- ~ 2 4 8425. CARDONA GUEVARA AARON IVAN M 21
## 5 D00- ~ 1 5 28429. JAVIER MARQUEZ AARON ALEJAND~ M 27
## 6 D00- ~ 2 6 15936. CASTIL~ RANGEL AARON <NA> M 9
## 7 D00- ~ 1 7 14032. GUERRE~ RODRIG~ AARON <NA> M 15
## 8 D00- ~ 2 8 3767. BENCOMO RUBIO AARON MARTIN M 9
## 9 D00- ~ 1 9 1742. GARCIA RAMON AARON NEFTALI M 3
## 10 D00- ~ 2 10 16206. SEGUNDO DIONIC~ AARON MELCHOR M 15
## # ... with 23,335 more rows, and 2 more variables: SEG_SOCIAL <dbl>,
## # ID_PROD <dbl>
primas <- read_csv("bases/PRIMAS_EJE_CARGA.csv", skip = 2, n_max = 5)
## Parsed with column specification:
## cols(
## POLIZA = col_character(),
## ENDOSO = col_double(),
## ID_CONS = col_double(),
## PRIMA = col_double(),
## PATERNO = col_character(),
## MATERNO = col_character(),
## NOMBRE = col_character(),
## NOMBRE_2 = col_character(),
## SEXO = col_character(),
## PLAZO = col_double(),
## SEG_SOCIAL = col_double(),
## ID_PROD = col_double()
## )
#install.packages("data.table")
library(data.table)
##
## Attaching package: 'data.table'
## The following objects are masked from 'package:dplyr':
##
## between, first, last
## The following object is masked from 'package:purrr':
##
## transpose
primas_fread <- fread("bases/PRIMAS_EJE_CARGA.csv", skip = 2, sep = ",")
head(primas_fread,5)
## POLIZA ENDOSO ID_CONS PRIMA PATERNO MATERNO NOMBRE NOMBRE_2
## 1: D00- 201901 1 1 20975.47 MURRIETA GAREY LETICIA
## 2: D00- 201901 2 2 32021.65 MEZA MEZA OMAR
## 3: D00- 201901 1 3 60285.43 LOPEZ ARAGON AARON FEDERICO
## 4: D00- 201901 2 4 8425.26 CARDONA GUEVARA AARON IVAN
## 5: D00- 201901 1 5 28428.92 JAVIER MARQUEZ AARON ALEJANDRO
## SEXO PLAZO SEG_SOCIAL ID_PROD
## 1: F 15 1 720
## 2: M 15 2 700
## 3: M 21 1 700
## 4: M 21 1 700
## 5: M 27 1 700
Ahora validamos ó exploramos los datos que cargamos en el ambiente con las siguientes funciones estadísticas
class(primas_fread)
## [1] "data.table" "data.frame"
Podemos obtener aún más
library(dplyr)
glimpse(primas_fread)
## Observations: 23,345
## Variables: 12
## $ POLIZA <chr> "D00- 201901", "D00- 201901", "D00- 201901", "D00- ...
## $ ENDOSO <int> 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, ...
## $ ID_CONS <int> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, ...
## $ PRIMA <dbl> 20975.47, 32021.65, 60285.43, 8425.26, 28428.92, 15...
## $ PATERNO <chr> "MURRIETA", "MEZA", "LOPEZ", "CARDONA", "JAVIER", "...
## $ MATERNO <chr> "GAREY", "MEZA", "ARAGON", "GUEVARA", "MARQUEZ", "R...
## $ NOMBRE <chr> "LETICIA", "OMAR", "AARON", "AARON", "AARON", "AARO...
## $ NOMBRE_2 <chr> "", "", "FEDERICO", "IVAN", "ALEJANDRO", "", "", "M...
## $ SEXO <chr> "F", "M", "M", "M", "M", "M", "M", "M", "M", "M", "...
## $ PLAZO <int> 15, 15, 21, 21, 27, 9, 15, 9, 3, 15, 15, 15, 21, 9,...
## $ SEG_SOCIAL <int> 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 1, 1, 1, 1, ...
## $ ID_PROD <int> 720, 700, 700, 700, 700, 720, 700, 720, 700, 700, 7...
Un poco más
str(primas_fread)
## Classes 'data.table' and 'data.frame': 23345 obs. of 12 variables:
## $ POLIZA : chr "D00- 201901" "D00- 201901" "D00- 201901" "D00- 201901" ...
## $ ENDOSO : int 1 2 1 2 1 2 1 2 1 2 ...
## $ ID_CONS : int 1 2 3 4 5 6 7 8 9 10 ...
## $ PRIMA : num 20975 32022 60285 8425 28429 ...
## $ PATERNO : chr "MURRIETA" "MEZA" "LOPEZ" "CARDONA" ...
## $ MATERNO : chr "GAREY" "MEZA" "ARAGON" "GUEVARA" ...
## $ NOMBRE : chr "LETICIA" "OMAR" "AARON" "AARON" ...
## $ NOMBRE_2 : chr "" "" "FEDERICO" "IVAN" ...
## $ SEXO : chr "F" "M" "M" "M" ...
## $ PLAZO : int 15 15 21 21 27 9 15 9 3 15 ...
## $ SEG_SOCIAL: int 1 2 1 1 1 1 1 1 1 1 ...
## $ ID_PROD : int 720 700 700 700 700 720 700 720 700 700 ...
## - attr(*, ".internal.selfref")=<externalptr>
la mejor información!!!
summary(primas_fread)
## POLIZA ENDOSO ID_CONS PRIMA
## Length:23345 Min. : 1.000 Min. : 1 Min. : -2335
## Class :character 1st Qu.: 1.000 1st Qu.: 5837 1st Qu.: 5637
## Mode :character Median : 2.000 Median :11673 Median : 11046
## Mean : 1.504 Mean :11673 Mean : 14705
## 3rd Qu.: 2.000 3rd Qu.:17509 3rd Qu.: 19253
## Max. :33.000 Max. :23345 Max. :415787
## PATERNO MATERNO NOMBRE
## Length:23345 Length:23345 Length:23345
## Class :character Class :character Class :character
## Mode :character Mode :character Mode :character
##
##
##
## NOMBRE_2 SEXO PLAZO SEG_SOCIAL
## Length:23345 Length:23345 Min. : 3.00 Min. :1.000
## Class :character Class :character 1st Qu.: 9.00 1st Qu.:1.000
## Mode :character Mode :character Median :15.00 Median :1.000
## Mean :16.18 Mean :1.137
## 3rd Qu.:21.00 3rd Qu.:1.000
## Max. :34.00 Max. :4.000
## ID_PROD
## Min. : 242
## 1st Qu.: 638
## Median : 700
## Mean : 669
## 3rd Qu.: 700
## Max. :1780
OBJETIVO: Manejo de datos
Normalmente los datos en R son almacenados como data.frame
Un data.frame es una lista de vectores de la misma longitud, piensenlos como una tabla de observaciones (individuos), cada entrada del vector en la lista forma una columna, cada columna puede ser de diferente tipo, conocemos a las columnas como variables y a las filas como observaciones.
Un data.frame tiene entonces dos dimensiones correspondientes al numero de filas y columnas, en ese estricto orden.
Empezaremos a hacer nuestros primeros subsets, muy utiles en la vida real.
Empezamos con un clasico, filter
filter(primas_fread, PLAZO == 34 & SEXO == "F")
## POLIZA ENDOSO ID_CONS PRIMA PATERNO MATERNO NOMBRE NOMBRE_2
## 1 D00- 201901 1 16619 18224.27 HERNANDEZ MORALES MARIA DEL CARMEN
## SEXO PLAZO SEG_SOCIAL ID_PROD
## 1 F 34 1 1780
filter(primas_fread, PLAZO == 3, NOMBRE %in% c("AARON", "RICARDO"))
## POLIZA ENDOSO ID_CONS PRIMA PATERNO MATERNO NOMBRE
## 1 D00- 201901 1 9 1742.10 GARCIA RAMON AARON
## 2 D00- 201901 2 16 4997.92 REYES URBINA AARON
## 3 D00- 201901 1 17 9411.26 DE LA ROSA SOTO AARON
## 4 D00- 201901 2 22 1086.45 TORRES ALONSO AARON
## 5 D00- 201901 2 20218 7138.09 RAMIREZ MAAS RICARDO
## 6 D00- 201901 1 20241 3867.84 OCEGUERA GOMEZ RICARDO
## 7 D00- 201901 2 20242 3911.27 JUAREZ RAMIREZ RICARDO
## 8 D00- 201901 2 20256 3892.39 MARTINEZ GARCIA RICARDO
## 9 D00- 201901 2 20274 3905.70 FLORES GARCIA RICARDO
## 10 D00- 201901 1 20275 3107.25 BURGOS GAMONEDA RICARDO
## 11 D00- 201901 1 20291 3440.37 MORENO OLIVA RICARDO
## 12 D00- 201901 2 20304 13680.13 NAVA CERVANTES RICARDO
## 13 D00- 201901 1 20305 16946.59 NAVA CERVANTES RICARDO
## 14 D00- 201901 1 20325 8340.28 FRANCISCO JUAREZ RICARDO
## 15 D00- 201901 1 20345 10971.09 RENTERIA SALAS RICARDO
## 16 D00- 201901 1 20347 3140.36 ALTAMIRANO PIZARRO RICARDO
## NOMBRE_2 SEXO PLAZO SEG_SOCIAL ID_PROD
## 1 NEFTALI M 3 1 700
## 2 ADRIAN M 3 1 700
## 3 ALBERTO M 3 1 700
## 4 EMMANUEL M 3 1 700
## 5 M 3 1 700
## 6 M 3 1 754
## 7 ALBERTO M 3 1 700
## 8 ANTONIO M 3 1 700
## 9 M 3 1 700
## 10 M 3 1 700
## 11 M 3 1 700
## 12 FRANCISCO M 3 1 700
## 13 M 3 1 700
## 14 M 3 1 700
## 15 DARIO M 3 1 700
## 16 M 3 1 700
Buen acceso a ciertas observaciones, slice
slice(primas_fread, 1:5)
## POLIZA ENDOSO ID_CONS PRIMA PATERNO MATERNO NOMBRE NOMBRE_2
## 1 D00- 201901 1 1 20975.47 MURRIETA GAREY LETICIA
## 2 D00- 201901 2 2 32021.65 MEZA MEZA OMAR
## 3 D00- 201901 1 3 60285.43 LOPEZ ARAGON AARON FEDERICO
## 4 D00- 201901 2 4 8425.26 CARDONA GUEVARA AARON IVAN
## 5 D00- 201901 1 5 28428.92 JAVIER MARQUEZ AARON ALEJANDRO
## SEXO PLAZO SEG_SOCIAL ID_PROD
## 1 F 15 1 720
## 2 M 15 2 700
## 3 M 21 1 700
## 4 M 21 1 700
## 5 M 27 1 700
Que pasó aqui?
head(slice(primas_fread,-c(1,2)))
## POLIZA ENDOSO ID_CONS PRIMA PATERNO MATERNO NOMBRE NOMBRE_2
## 1 D00- 201901 1 3 60285.43 LOPEZ ARAGON AARON FEDERICO
## 2 D00- 201901 2 4 8425.26 CARDONA GUEVARA AARON IVAN
## 3 D00- 201901 1 5 28428.92 JAVIER MARQUEZ AARON ALEJANDRO
## 4 D00- 201901 2 6 15935.75 CASTILLO RANGEL AARON
## 5 D00- 201901 1 7 14032.46 GUERRERO RODRIGUEZ AARON
## 6 D00- 201901 2 8 3766.85 BENCOMO RUBIO AARON MARTIN
## SEXO PLAZO SEG_SOCIAL ID_PROD
## 1 M 21 1 700
## 2 M 21 1 700
## 3 M 27 1 700
## 4 M 9 1 720
## 5 M 15 1 700
## 6 M 9 1 720
Revisemos con un head y un tail
head(primas_fread)
## POLIZA ENDOSO ID_CONS PRIMA PATERNO MATERNO NOMBRE NOMBRE_2
## 1: D00- 201901 1 1 20975.47 MURRIETA GAREY LETICIA
## 2: D00- 201901 2 2 32021.65 MEZA MEZA OMAR
## 3: D00- 201901 1 3 60285.43 LOPEZ ARAGON AARON FEDERICO
## 4: D00- 201901 2 4 8425.26 CARDONA GUEVARA AARON IVAN
## 5: D00- 201901 1 5 28428.92 JAVIER MARQUEZ AARON ALEJANDRO
## 6: D00- 201901 2 6 15935.75 CASTILLO RANGEL AARON
## SEXO PLAZO SEG_SOCIAL ID_PROD
## 1: F 15 1 720
## 2: M 15 2 700
## 3: M 21 1 700
## 4: M 21 1 700
## 5: M 27 1 700
## 6: M 9 1 720
tail(primas_fread)
## POLIZA ENDOSO ID_CONS PRIMA PATERNO MATERNO NOMBRE
## 1: D00- 201901 2 23340 1923.02 PEDRAZA PE?A ZURISADDAI
## 2: D00- 201901 1 23341 15031.21 PINTO DUARTE ZURISADDAI
## 3: D00- 201901 2 23342 14564.44 ESPA?A PEREZ ZUSET
## 4: D00- 201901 1 23343 5693.09 QUINTERO GARCIA ZUXCEL
## 5: D00- 201901 2 23344 12837.95 ESCOBAR SANCHEZ ZYANYA
## 6: D00- 201901 3 23345 30091.90 VALENCIA LOPEZ ZYZLILA
## NOMBRE_2 SEXO PLAZO SEG_SOCIAL ID_PROD
## 1: F 15 4 642
## 2: F 27 4 638
## 3: F 15 1 638
## 4: CRISTINA F 27 1 638
## 5: MARIANA F 27 1 638
## 6: F 9 1 638
Entonces slice y filter se usan para extraer algun tipo de “observación, row, fila, value, entrada, etc.”, de la misma forma usamos select para acceder a las columnas.
select(slice(primas_fread, 23340:23345), c(PATERNO, MATERNO, NOMBRE))
## PATERNO MATERNO NOMBRE
## 1 PEDRAZA PE?A ZURISADDAI
## 2 PINTO DUARTE ZURISADDAI
## 3 ESPA?A PEREZ ZUSET
## 4 QUINTERO GARCIA ZUXCEL
## 5 ESCOBAR SANCHEZ ZYANYA
## 6 VALENCIA LOPEZ ZYZLILA
…podemos usar algo super util como el simbolo de $, el cual nos ayudara a acceder a una columna especifica de un df
sd(primas_fread$PRIMA)
## [1] 14830.78
o tambien…
mean(primas_fread$PRIMA)
## [1] 14704.87
Ejercicio 1
El objetivo del siguiente ejericio es para que practiquen, algunas cosas que hemos aprendido, traten de hacerlo siguiendo las notas, recuerden que deben de tener instalado y cargado el tidyverse.
Usen el archivo que esta en la carpeta de las bases de mi repo denominado PRIMAS_EJE_AUTOS.csv.
readr, y limiten la lectura a 20 rows.library(readr)
read_csv("C:/Users/Administrador/Desktop/DOC/WORKSHOP_R/Workshop_Seguros/bases/PRIMAS_EJE_AUTOS.csv", n_max = 20)
## Warning: Missing column names filled in: 'X2' [2], 'X4' [4], 'X7' [7],
## 'X8' [8], 'X9' [9], 'X10' [10], 'X11' [11], 'X12' [12], 'X13' [13],
## 'X14' [14], 'X15' [15], 'X16' [16], 'X17' [17]
## Warning: Duplicated column names deduplicated: '201906' => '201906_1' [6]
## Parsed with column specification:
## cols(
## `FECHA CONTABLE DE:` = col_character(),
## X2 = col_character(),
## `201906` = col_character(),
## X4 = col_character(),
## A = col_character(),
## `201906_1` = col_character(),
## X7 = col_character(),
## X8 = col_character(),
## X9 = col_character(),
## X10 = col_character(),
## X11 = col_character(),
## X12 = col_character(),
## X13 = col_character(),
## X14 = col_character(),
## X15 = col_character(),
## X16 = col_character(),
## X17 = col_character()
## )
## # A tibble: 20 x 17
## `FECHA CONTABLE~ X2 `201906` X4 A `201906_1` X7 X8 X9
## <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr>
## 1 RAMO: TODOS <NA> AGEN~ 700_~ <NA> <NA> SUC ~ TODOS
## 2 <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>
## 3 moneda ramo subramo sucu~ poli~ endoso tipo~ fech~ id_a~
## 4 1 2 1 I10_~ 1103~ 1 D 2019~ 700_~
## 5 1 2 1 I10_~ 1039~ 1 D 2019~ 700_~
## 6 1 2 1 I10_~ 90430 2 D 2019~ 700_~
## 7 1 2 1 I10_~ 1052~ 9003 A 2019~ 700_~
## 8 2 2 11 I10 1111~ 0 <NA> 2019~ 700_~
## 9 2 2 1 I10 1052~ 9002 A 2019~ 700_~
## 10 2 2 1 I10 1108~ 0 <NA> 2019~ 700_~
## 11 2 2 1 I10 1107~ 0 <NA> 2019~ 700_~
## 12 2 2 1 I10 1110~ 0 <NA> 2019~ 700_~
## 13 2 2 1 I10 1106~ 0 <NA> 2019~ 700_~
## 14 2 2 1 I10 1109~ 0 <NA> 2019~ 700_~
## 15 1 2 1 I10_~ 1109~ 0 <NA> 2019~ 700_~
## 16 2 2 1 D00 1039~ 0 <NA> 2019~ 700_~
## 17 1 2 1 I10_~ 1107~ 0 <NA> 2019~ 700_~
## 18 1 2 1 I10_~ 1108~ 0 <NA> 2019~ 700_~
## 19 1 2 1 I10_~ 1110~ 0 <NA> 2019~ 700_~
## 20 1 2 1 I10_~ 1111~ 0 <NA> 2019~ 700_~
## # ... with 8 more variables: X10 <chr>, X11 <chr>, X12 <chr>, X13 <chr>,
## # X14 <chr>, X15 <chr>, X16 <chr>, X17 <chr>
library(readr)
test <- read_csv("C:/Users/Administrador/Desktop/DOC/WORKSHOP_R/Workshop_Seguros/bases/PRIMAS_EJE_AUTOS.csv", skip = 3)
## Warning: Duplicated column names deduplicated: 'subramo' =>
## 'subramo_1' [17]
## Parsed with column specification:
## cols(
## moneda = col_double(),
## ramo = col_double(),
## subramo = col_double(),
## sucursal = col_character(),
## poliza = col_double(),
## endoso = col_double(),
## tipo_endoso = col_character(),
## fecha_contable = col_double(),
## id_age = col_character(),
## inicio_vig = col_character(),
## fin_vig = col_character(),
## contratante = col_character(),
## prima = col_double(),
## comision = col_double(),
## `area-comercial` = col_character(),
## tipo_pol = col_character(),
## subramo_1 = col_character()
## )
summary(test)
## moneda ramo subramo sucursal
## Min. :1.000 Min. :2 Min. : 1.000 Length:56
## 1st Qu.:1.000 1st Qu.:2 1st Qu.: 1.000 Class :character
## Median :1.000 Median :2 Median : 1.000 Mode :character
## Mean :1.143 Mean :2 Mean : 1.536
## 3rd Qu.:1.000 3rd Qu.:2 3rd Qu.: 1.000
## Max. :2.000 Max. :2 Max. :11.000
## poliza endoso tipo_endoso fecha_contable
## Min. : 90430 Min. : 0.0 Length:56 Min. :201906
## 1st Qu.: 110758 1st Qu.: 0.0 Class :character 1st Qu.:201906
## Median : 110922 Median : 0.0 Mode :character Median :201906
## Mean : 159939 Mean : 321.6 Mean :201906
## 3rd Qu.: 111053 3rd Qu.: 0.0 3rd Qu.:201906
## Max. :1039196 Max. :9003.0 Max. :201906
## id_age inicio_vig fin_vig
## Length:56 Length:56 Length:56
## Class :character Class :character Class :character
## Mode :character Mode :character Mode :character
##
##
##
## contratante prima comision area-comercial
## Length:56 Min. :-28765 Min. : 200.0 Length:56
## Class :character 1st Qu.: 5730 1st Qu.: 237.5 Class :character
## Mode :character Median : 7888 Median : 375.0 Mode :character
## Mean : 16158 Mean : 487.5
## 3rd Qu.: 11170 3rd Qu.: 625.0
## Max. :131253 Max. :1000.0
## tipo_pol subramo_1
## Length:56 Length:56
## Class :character Class :character
## Mode :character Mode :character
##
##
##
str(test)
## Classes 'spec_tbl_df', 'tbl_df', 'tbl' and 'data.frame': 56 obs. of 17 variables:
## $ moneda : num 1 1 1 1 2 2 2 2 2 2 ...
## $ ramo : num 2 2 2 2 2 2 2 2 2 2 ...
## $ subramo : num 1 1 1 1 11 1 1 1 1 1 ...
## $ sucursal : chr "I10_20" "I10_20" "I10_20" "I10_20" ...
## $ poliza : num 110332 103968 90430 105232 111102 ...
## $ endoso : num 1 1 2 9003 0 ...
## $ tipo_endoso : chr "D" "D" "D" "A" ...
## $ fecha_contable: num 201906 201906 201906 201906 201906 ...
## $ id_age : chr "700_23" "700_23" "700_23" "700_23" ...
## $ inicio_vig : chr "24/05/2019" "07/06/2019" "06/06/2019" "15/04/2019" ...
## $ fin_vig : chr "24/05/2020" "08/01/2020" "26/08/2019" "31/01/2020" ...
## $ contratante : chr "CONTRATANTE ANONIMO 1" "CONTRATANTE ANONIMO 1" "CONTRATANTE ANONIMO 1" "CONTRATANTE ANONIMO 1" ...
## $ prima : num -28765 -10592 -1393 1275 598 ...
## $ comision : num 250 1000 250 200 250 500 1000 1000 1000 1000 ...
## $ area-comercial: chr "SUR" "NORTE" "SUR" "NORTE" ...
## $ tipo_pol : chr "Nueva" "Nueva" "Nueva" "Nueva" ...
## $ subramo_1 : chr "Autos" "Autos" "Autos" "Autos" ...
## - attr(*, "spec")=
## .. cols(
## .. moneda = col_double(),
## .. ramo = col_double(),
## .. subramo = col_double(),
## .. sucursal = col_character(),
## .. poliza = col_double(),
## .. endoso = col_double(),
## .. tipo_endoso = col_character(),
## .. fecha_contable = col_double(),
## .. id_age = col_character(),
## .. inicio_vig = col_character(),
## .. fin_vig = col_character(),
## .. contratante = col_character(),
## .. prima = col_double(),
## .. comision = col_double(),
## .. `area-comercial` = col_character(),
## .. tipo_pol = col_character(),
## .. subramo_1 = col_character()
## .. )
OBJETIVO: Pipes, datos en forma tidy y vervos de la librería
Sigan cuidadosamente las siguientes instrucciones, inicien RStudio y generen un nuevo proyecto:
File -> New Project... -> Existing Directory -> Browse... -> seleccionar carpeta destino -> Open -> Create ProjectFile -> New File -> R scriptFile -> Save As -> ruta a su carpeta y nombre del file
library(dplyr)
library(readr)
emision <- read.csv(list.files(pattern='EMISION'), header = T, skip = 2, stringsAsFactors=F)
Revisamos los datos:
str(emision)
## 'data.frame': 854 obs. of 74 variables:
## $ Moneda : int 1 1 1 1 1 1 1 1 1 1 ...
## $ Sucursal : chr "I00" "I00" "I00" "I00" ...
## $ Producto : int 76 76 76 1 76 76 76 76 76 76 ...
## $ Poliza : int 41405 41471 41480 41483 41486 41522 41525 41537 41555 41579 ...
## $ Fecha.Ini : chr "03/01/2018" "05/01/2018" "05/01/2018" "05/01/2018" ...
## $ Fecha.Ter : chr "03/01/2019" "05/01/2019" "05/01/2019" "05/01/2019" ...
## $ Vehiculo : int 402743 400906 402558 11293 400015 402822 402663 402663 402663 402687 ...
## $ Descripcion : chr "BMW R 1200 R NINET URBAN G/S " "BMW F 800 GS " "BMW F 700 GS " "MINI COOPER PEPPER AUT 5PTAS " ...
## $ Modelo : int 2018 2018 2018 2018 2017 2018 2018 2018 2018 2018 ...
## $ Prima.Emitida : chr "0" "4,960.33" "0" "0" ...
## $ Prima.Devengada : chr "0" "4,958.61" "0" "0" ...
## $ Prima.Pagada : chr "0" "4,960.33" "0" "0" ...
## $ Monto.Siniestros : chr "0" "0" "0" "0" ...
## $ X..Siniestros : int 0 0 0 0 0 0 1 1 0 0 ...
## $ Desc..Grupo : chr "R 1200 " "F800 " "F 700 " "Mini Cooper " ...
## $ Agente : int 9114 9114 9114 9114 9114 9114 9114 9114 9114 9114 ...
## $ Desc.de.Agente : chr "BMW CONTADO " "BMW CONTADO " "BMW CONTADO " "BMW CONTADO " ...
## $ Ramo : int 2 2 2 2 2 2 2 2 2 2 ...
## $ SubRamo : int 5 5 5 1 5 5 5 5 5 5 ...
## $ Status : int 2 2 2 2 1 1 1 1 2 1 ...
## $ Fecha.Reg : chr "03/01/2018" "05/01/2018" "05/01/2018" "05/01/2018" ...
## $ Num.Serie : chr "WB10J410XJZ874787 " "WB10B0702JZ946434 " "WB10B0608JZ932393 " "WMWXS5104J2G17847 " ...
## $ Comis.Agente : int 0 0 0 0 0 0 0 0 0 0 ...
## $ Asegurado : chr "RICARDO GUISEPPE BERTAZZONI " "ADOLFO MALDONADO FUENTES " "RICARDO HERNANDEZ TANUS " "SANDRA LAGUNA PONCE " ...
## $ Contrato : logi NA NA NA NA NA NA ...
## $ Fecha.Cont : int 201801 201801 201801 201801 201801 201801 201801 201801 201801 201801 ...
## $ Agte.UDI.1 : int 11 11 11 11 11 11 11 11 11 11 ...
## $ Descripcion_Agte_UDI_1 : chr " BMW FINANCIAL SERVICES DE MEXICO, S.A. DE C.V " " BMW FINANCIAL SERVICES DE MEXICO, S.A. DE C.V " " BMW FINANCIAL SERVICES DE MEXICO, S.A. DE C.V " " BMW FINANCIAL SERVICES DE MEXICO, S.A. DE C.V " ...
## $ Porc.UDI.1 : num 8.5 8.5 8.5 6.5 8.5 ...
## $ Monto.UDI.1 : num 594 823 1162 901 1449 ...
## $ Usuario : chr "EUROMOTQ" "VECSAOAX" "IMAGENM0" "VECSAPUE" ...
## $ Usuario.Aut : chr "EUROMOTQ" "VECSAOAX" "IMAGENM0" "VECSAPUE" ...
## $ Mtvo_statpol : chr "A PETICIóN DEL ASEGURADO " "CANCELACIóN FALTA DE PAGO " "CANCELACIóN FALTA DE PAGO " "CANCELACIóN FALTA DE PAGO " ...
## $ Edo..Circula : chr "QUERETARO " "OAXACA " "CIUDAD DE MEXICO " "PUEBLA " ...
## $ Forma.de.Pago : int 1 4 1 1 1 2 1 1 4 1 ...
## $ Agte.UDI.2 : int 608 801 600 604 621 602 602 614 614 784 ...
## $ Descripcion_agte_udi._2 : chr "EUROMOTORS DE QUERETARO, S.A. DE C.V. " "VEHICULOS EUROPEOS DE CALIDAD OAXACA SA DE CV " "IMAGEN MOTORS, S.A. DE C.V. " "VEHICULOS EUROPEOS DE CALIDAD, S.A. DE C.V. " ...
## $ Porc.UDI._2 : num 17.5 17.5 17.5 17.5 17.5 ...
## $ Monto.UDI_.2 : num 1223 1695 2394 2426 2984 ...
## $ Pol.coasegurador : int 0 0 0 0 0 0 0 0 0 0 ...
## $ Cd.canal : int 0 0 0 0 0 0 0 0 0 0 ...
## $ Cd.ramo : int 0 0 0 0 0 0 0 0 0 0 ...
## $ Anio.pol : int 0 0 0 0 0 0 0 0 0 0 ...
## $ Sexo.del.conductor : chr "M " "M " "M " "M " ...
## $ Edad.del.conductor : int 0 37 20 47 35 29 52 23 53 0 ...
## $ Fecha.de.Nacimiento.del.Conductor: logi NA NA NA NA NA NA ...
## $ Fecha.de.Nacimiento.del.Asegurado: chr "03/01/2018" "24/01/1981" "18/02/1998" "15/11/1971" ...
## $ Tipo.Persona : chr "FISICA " "FISICA " "FISICA " "FISICA " ...
## $ Edad.del.asegurado : chr "0" "36" "19" "46" ...
## $ Rfc.del.asegurado : chr "XEXX010101000 " "MAFA810124EM0 " "HETR980218 " "LAPS711115J68 " ...
## $ Fecha.Nac..Fianl : logi NA NA NA NA NA NA ...
## $ X.IVA.Poliza : chr "16.00%" "16.00%" "16.00%" "16.00%" ...
## $ X.Comision.Agente : chr "0%" "0%" "0%" "0%" ...
## $ Plan.de.Poliza : chr " 114 BASICO " " 116 PREMIUM " " 116 PREMIUM " " 116 PREMIUM " ...
## $ Direccion.registrada : chr "SAN AGUSTIN 213 A,CLAUSTROS DEL PARQUE,76168 " "AV. HIDALGO 45,PRIMERA SECCION,70117 " "FRANCISCO ESPEJEL 64 EDIF J 5 004 CONDOMINIO 8,7 DE JULIO,15390 " "RODRIGUEZ ALCONERO 1624,CIUDAD SATELITE,72320 " ...
## $ Clave : int 0 0 0 0 0 0 0 0 0 0 ...
## $ Descripcion.del.agrupador : logi NA NA NA NA NA NA ...
## $ Cancelable : chr "S" "S" "S" "S" ...
## $ Bono : chr "SI " "SI " "SI " "SI " ...
## $ Tipo.de.Tarifa : int 2 2 16 2 2 16 16 16 16 16 ...
## $ Descripcion.1 : chr "TARIFA ESPECIAL " "TARIFA ESPECIAL " "VALOR FACTURA " "TARIFA ESPECIAL " ...
## $ Plan.Piso : chr "No " "No " "No " "No " ...
## $ Alfa : logi NA NA NA NA NA NA ...
## $ Beta : int 1 1 1 1 1 1 1 1 1 1 ...
## $ Gastos : int 780 780 780 780 780 780 780 780 780 780 ...
## $ Fondo.Especia : logi NA NA NA NA NA NA ...
## $ Sucursal.Agente : chr "DCD" "DCD" "DCD" "DCD" ...
## $ Dirección.Comercial : chr "MICHAEL PETER SCHITTEK " "MICHAEL PETER SCHITTEK " "MICHAEL PETER SCHITTEK " "MICHAEL PETER SCHITTEK " ...
## $ Tipo.carga : int 0 0 0 0 0 0 0 0 0 0 ...
## $ Descuento.Especial : num 0 0 0 0 0 0 0 0 0 0 ...
## $ Descuento.por.volúmen : int 0 0 0 0 0 0 0 0 0 0 ...
## $ Descuento.por.estado : int 0 0 0 0 0 0 0 0 0 0 ...
## $ Clave.Vehiculo.Santander : logi NA NA NA NA NA NA ...
## $ Marca : chr "MOTOS BMW" "MOTOS BMW" "MOTOS BMW" "MINI" ...
Verbos de dplyr que usaremos:
Provided by https://dplyr.tidyverse.org/
emision_modificado <- emision %>%
mutate(POL_COMPL = paste(Sucursal, Producto, Poliza, sep = "-"))
str(emision_modificado)
#Primeros 4 digitos de un valor
emision_modificado <- emision_modificado %>%
mutate(Año_cont = sub("^(\\d{4}).*$", "\\1", Fecha.Cont))
#Ultimos 4 digitos de un valor
#sub(".*(\\d+{4}).*$", "\\1", df)
str(emision_modificado)
emision_modificado <- emision_modificado %>%
select(-(c(Contrato,Fondo.Especia,Clave.Vehiculo.Santander)))
colnames(emision_modificado)
## [1] "Moneda"
## [2] "Sucursal"
## [3] "Producto"
## [4] "Poliza"
## [5] "Fecha.Ini"
## [6] "Fecha.Ter"
## [7] "Vehiculo"
## [8] "Descripcion"
## [9] "Modelo"
## [10] "Prima.Emitida"
## [11] "Prima.Devengada"
## [12] "Prima.Pagada"
## [13] "Monto.Siniestros"
## [14] "X..Siniestros"
## [15] "Desc..Grupo"
## [16] "Agente"
## [17] "Desc.de.Agente"
## [18] "Ramo"
## [19] "SubRamo"
## [20] "Status"
## [21] "Fecha.Reg"
## [22] "Num.Serie"
## [23] "Comis.Agente"
## [24] "Asegurado"
## [25] "Fecha.Cont"
## [26] "Agte.UDI.1"
## [27] "Descripcion_Agte_UDI_1"
## [28] "Porc.UDI.1"
## [29] "Monto.UDI.1"
## [30] "Usuario"
## [31] "Usuario.Aut"
## [32] "Mtvo_statpol"
## [33] "Edo..Circula"
## [34] "Forma.de.Pago"
## [35] "Agte.UDI.2"
## [36] "Descripcion_agte_udi._2"
## [37] "Porc.UDI._2"
## [38] "Monto.UDI_.2"
## [39] "Pol.coasegurador"
## [40] "Cd.canal"
## [41] "Cd.ramo"
## [42] "Anio.pol"
## [43] "Sexo.del.conductor"
## [44] "Edad.del.conductor"
## [45] "Fecha.de.Nacimiento.del.Conductor"
## [46] "Fecha.de.Nacimiento.del.Asegurado"
## [47] "Tipo.Persona"
## [48] "Edad.del.asegurado"
## [49] "Rfc.del.asegurado"
## [50] "Fecha.Nac..Fianl"
## [51] "X.IVA.Poliza"
## [52] "X.Comision.Agente"
## [53] "Plan.de.Poliza"
## [54] "Direccion.registrada"
## [55] "Clave"
## [56] "Descripcion.del.agrupador"
## [57] "Cancelable"
## [58] "Bono"
## [59] "Tipo.de.Tarifa"
## [60] "Descripcion.1"
## [61] "Plan.Piso"
## [62] "Alfa"
## [63] "Beta"
## [64] "Gastos"
## [65] "Sucursal.Agente"
## [66] "Dirección.Comercial"
## [67] "Tipo.carga"
## [68] "Descuento.Especial"
## [69] "Descuento.por.volúmen"
## [70] "Descuento.por.estado"
## [71] "Marca"
## [72] "POL_COMPL"
## [73] "Año_cont"
No guardamos lo siguiente en la variable, solo observen que pasa.
emision_modificado %>%
select(ends_with("conductor")) %>%
head()
## Sexo.del.conductor Edad.del.conductor Fecha.de.Nacimiento.del.Conductor
## 1 M 0 NA
## 2 M 37 NA
## 3 M 20 NA
## 4 M 47 NA
## 5 M 35 NA
## 6 M 29 NA
emision_modificado <- emision_modificado %>%
filter(Año_cont == "2018", Marca %in% c("MINI","Ferrari"))
head(emision_modificado)
emision_modificado <- emision_modificado %>%
group_by(Desc.de.Agente) %>%
summarise(cuenta = n())
emision_modificado
## # A tibble: 3 x 2
## Desc.de.Agente cuenta
## <chr> <int>
## 1 "BMW CONTADO ~ 91
## 2 "BMW EMPLEADOS CONTADO ~ 1
## 3 "BMW USADOS CONTADO ~ 59
emision_modificado %>%
arrange(desc(cuenta))
## # A tibble: 3 x 2
## Desc.de.Agente cuenta
## <chr> <int>
## 1 "BMW CONTADO ~ 91
## 2 "BMW USADOS CONTADO ~ 59
## 3 "BMW EMPLEADOS CONTADO ~ 1
emision_modificado <- emision_modificado %>%
arrange(cuenta)
emision_modificado
## # A tibble: 3 x 2
## Desc.de.Agente cuenta
## <chr> <int>
## 1 "BMW EMPLEADOS CONTADO ~ 1
## 2 "BMW USADOS CONTADO ~ 59
## 3 "BMW CONTADO ~ 91
…y la magia de dplyr es: un solo PIPE!!!!!
emision %>%
mutate(POL_COMPL = paste(Sucursal, Producto, Poliza, sep = "-")) %>%
mutate(Año_cont = sub("^(\\d{4}).*$", "\\1", Fecha.Cont)) %>%
select(-(c(Contrato,Fondo.Especia,Clave.Vehiculo.Santander))) %>%
filter(Año_cont == "2018", Marca %in% c("MINI","Ferrari")) %>%
group_by(Desc.de.Agente, Marca) %>%
summarise(cuenta = n()) %>%
arrange(cuenta)
## # A tibble: 3 x 3
## # Groups: Desc.de.Agente [3]
## Desc.de.Agente Marca cuenta
## <chr> <chr> <int>
## 1 "BMW EMPLEADOS CONTADO ~ MINI 1
## 2 "BMW USADOS CONTADO ~ MINI 59
## 3 "BMW CONTADO ~ MINI 91
Lo guardan en su variable y listo!!!
emision_modificado <- emision %>%
mutate(POL_COMPL = paste(Sucursal, Producto, Poliza, sep = "-")) %>%
mutate(Año_cont = sub("^(\\d{4}).*$", "\\1", Fecha.Cont)) %>%
select(-(c(Contrato,Fondo.Especia,Clave.Vehiculo.Santander))) %>%
filter(Año_cont == "2018", Marca %in% c("MINI","Ferrari")) %>%
group_by(Desc.de.Agente, Marca) %>%
summarise(cuenta = n()) %>%
arrange(cuenta)
Aplausos!!!
Extra. Un link muy bueno para “regex” https://www.rexegg.com/regex-quickstart.html
Y tambien este super bien explicado https://dev.to/emmawedekind/regex-cheat-sheet-2j2a
OBJETIVO: Graficar entendiendo los datos, escalas y tipos de gráficos, mejorar visualizaciones actuales
Empezamos usando los datos de la ultima sesión.
library(dplyr)
library(readr)
emision <- read.csv(list.files(pattern='EMISION'), header = T, skip = 2, stringsAsFactors=F)
Revisamos los datos:
str(emision)
Si pudieron cargar tidyverse solo habiliten la libreria.
library(ggplot2)
Si NO pudieron cargar tidyverse, descarguen ggplot2
install.packages("ggplot2")
library(ggplot2)
Ventajas de ggplot2:
¿Cómo se usa?
Empezamos con la función ggplot(), integrando nuestra base y sus variables (con aes()). Luego agregamos las coordenadas o puntos a graficar con geom_point() o con geom_histogram(), luego las escalas ó colores (como puede ser scale_colour_brewer()), algunas especificaciones como facet_wrap() y hasta títulos o marcas.
¿Y si graficamos con R base? ggplot2 VS R base de una manera muy sencilla.
hist(emision$Agte.UDI.2)
Y con ggplot2 se ve lo mismo de la siguiente forma:
ggplot(emision, aes(x = Agte.UDI.2)) +
geom_histogram()
Aesthetic Mapping
En el mundo de ggplot2 aesthetic significa “algo que puedes ver”. Puedes incluir las siguientes opciones:
Cada tipo de gráfico solo acepta un conjunto de datos, es natural de una gráfica de dos dimensiones.
Objetos geométricos (geom)
Son los tipos de gráficos que tenemos en cada imagen:
geom_point, para scatter plots, dot plots, etc.)geom_line, para time series, trend lines, etc.)geom_boxplot)Un gráfico al menos debe tener un objeto geométrico, y pueden ir agregando más con el símbolo +, que al ponerlo lo identa de manera correcta.
Puedes tener una buena ayuda con los objetos disponibles de la siguiente forma:
help.search("geom_", package = "ggplot2")
Un regalo…!
emision <- emision %>%
mutate(Prima.Emitida= as.numeric(sub(",", "", Prima.Emitida, fixed=TRUE))) %>%
filter(Fecha.Cont<201813 & Fecha.Cont>201800)
Revisamos lo que pasó….
emision %>%
mutate(Prima.Emitida= as.numeric(sub(",", "", Prima.Emitida, fixed=TRUE))) %>%
group_by(Fecha.Cont) %>%
summarise(Prima_E = sum(Prima.Emitida))
## # A tibble: 12 x 2
## Fecha.Cont Prima_E
## <int> <dbl>
## 1 201801 796008.
## 2 201802 576552.
## 3 201803 692319.
## 4 201804 912174.
## 5 201805 784586.
## 6 201806 550087.
## 7 201807 605270.
## 8 201808 698047.
## 9 201809 637993.
## 10 201810 671830.
## 11 201811 448868.
## 12 201812 885008.
Y graficamos…
ggplot(emision, aes(y = Prima.Emitida, x = Fecha.Cont)) +
geom_point()
ggplot(emision, aes(y = Prima.Emitida, x = Fecha.Cont)) +
geom_point() +
scale_x_continuous(limits = c(201801, 201812))+
ylab("Prima Emitida")+
xlab("Mes contable")
O queremos esto:
emision_resumen <- emision %>%
mutate(Prima.Emitida= as.numeric(sub(",", "", Prima.Emitida, fixed=TRUE))) %>%
group_by(Fecha.Cont) %>%
summarise(Prima_E = sum(Prima.Emitida))
Y se ve mejor asi:
ggplot(emision_resumen, aes(y = Prima_E, x = Fecha.Cont)) +
geom_point() +
scale_x_continuous(limits = c(201801, 201812))+
ylab("Prima Emitida")+
xlab("Mes contable")
Le subimos el volumen… otro regalo!!!
#Una regresion lineal sencilla
emision$pred.SC <- predict(lm(Prima.Emitida ~ log(Fecha.Cont), data = emision))
#Subset
emision_predic <- emision %>%
mutate(Prima.Emitida= as.numeric(sub(",", "", Prima.Emitida, fixed=TRUE))) %>%
group_by(Fecha.Cont) %>%
summarise(Prima_E = sum(Prima.Emitida),
Prima_predic= sum(pred.SC))
#De mejor interpretación
p1 <- ggplot(emision_predic, aes(x = log(Fecha.Cont), y = Prima_E))
p1 + geom_point() +
geom_line(aes(y = Prima_predic))
Agregamos una sombra de bandas de confianza….
p1 + geom_point() +
geom_line(aes(y = Prima_predic))+
geom_smooth()
Extra. Revisando los colores…
emision_resumen <- emision %>%
mutate(Prima.Emitida= as.numeric(sub(",", "", Prima.Emitida, fixed=TRUE)),
Prima.Pagada= as.numeric(sub(",", "", Prima.Pagada, fixed=TRUE))) %>%
group_by(Fecha.Cont,Marca,Desc..Grupo) %>%
filter(grepl('G|R|F|Mini', Desc..Grupo)) %>%
summarise(Prima_E = sum(Prima.Emitida),
Prima_P = sum(Prima.Pagada))
#Colores con "colour" rellena con una 3ra variable relacionada a las Y´s directamente
ggplot(emision_resumen, aes(x = log(Fecha.Cont), y = Prima_E, colour = Marca))+
geom_point()
Nice!!!
install.packages("ggthemes")
## Temas extra para mejorar la parte visual
library(ggthemes)
ggplot(emision_resumen, mapping = aes(x = log(Fecha.Cont), y = Prima_E)) + geom_point(aes(size=Prima_P, color=Marca)) +
geom_text(aes(label=Desc..Grupo, vjust=-1.0, hjust=0, alpha=0.5)) +
guides(fill=FALSE, alpha=FALSE, color=FALSE) +
labs(x = 'Fecha Contable (Escala Logaritmica)', y = 'Primas emitidas', size='Prima Pagada' ) + theme_hc()
OBJETIVO: Crear, guardar, ejecutar codigo en un reporte
RMD/R Markdown
La creación de documentos con Markdown R comienza con un archivo de extensión .Rmd, el cual contiene una combinación de markdown (contenido con formato de texto simple) y trozos de código R. El archivo .Rmd se alimenta a knitr, que ejecuta todos los trozos de código R y crea un nuevo documento de reducción (.md) que incluye el código R y su salida.
Ventajas respecto a otras herramientas de reportes:
Iniciamos
install.packages("rmarkdown")
library(rmarkdown)
Para efectos practicos seguiremos el siguiente tutorial que nuestros amigos de Rstudio ya hicierón.
https://rmarkdown.rstudio.com/lesson-1.html
(Seguimos lo más que se pueda esas notas, si no terminamos lo hacen en un rato libre, vale la pena!!!)
También instalamos lo siguiente para probar las ultimas maravillas que se pueden hacer en un RMD:
install.packages("reticulate")
library(reticulate)
para correr chunks de Python como sigue:
x = "Hello World!"
print(x)
## Hello World!
Ejercicio 2
Usando la base de emision de la sesión 6. (pueden volver a cargar la base emision como yo lo hice o como ustedes crean conveniente.)
library(readr)
library(dplyr)
emision <- read.csv(list.files(pattern='EMISION'), header = T, skip = 2, stringsAsFactors=F)
emision <- emision %>%
mutate(Prima.Emitida= as.numeric(sub(",", "", Prima.Emitida, fixed=TRUE)),Prima.Pagada= as.numeric(sub(",", "", Prima.Pagada, fixed=TRUE)))
sum(emision$Prima.Emitida)
## [1] 8327897
emision %>%
filter(Marca=="MINI") %>%
summarise(Prima.Emitida = sum(Prima.Emitida))
## Prima.Emitida
## 1 1753138
emi_grafica <- emision %>%
filter(Marca=="MINI") %>%
group_by(Fecha.Cont) %>%
summarise(Prima.Emitida = sum(Prima.Emitida),Prima.Pagada = sum(Prima.Pagada))
emi_grafica
## # A tibble: 12 x 3
## Fecha.Cont Prima.Emitida Prima.Pagada
## <int> <dbl> <dbl>
## 1 201801 87799. 87799.
## 2 201802 131891. 129034.
## 3 201803 207186. 207186.
## 4 201804 211238 211238
## 5 201805 143764. 140498.
## 6 201806 113199. 113199.
## 7 201807 175920. 163586.
## 8 201808 59746. 53488.
## 9 201809 139120. 121552.
## 10 201810 206017. 185333.
## 11 201811 46133. 36642.
## 12 201812 231124. 64775.
library(ggplot2)
ggplot(emi_grafica, aes(Fecha.Cont,Prima.Emitida)) +
geom_point(size=4, color="red") +
geom_line()
Todo lo anterior en un RMD con tus datos!
OBJETIVO: Minar, explorar, limpiar, visualizar, diseñar y construir modelos
Pueden ir descargando e instalando librerias!
#install.packages("tm")
#install.packages("qdap")
#install.packages("wordcloud")
library(tm)
#library(qdap)
library(wordcloud)
En una carpeta ponemos algunos libros, en este caso 2 versiones de la Biblia ed 1602 y 1909
biblia_corpus <- VCorpus(DirSource("C:/Users/Administrador/Desktop/DOC/WORKSHOP_R/Workshop_Seguros/Texto", encoding = "UTF-8"),readerControl = list(language = "es-419"))
inspect(biblia_corpus[1:2])
## <<VCorpus>>
## Metadata: corpus specific: 0, document level (indexed): 0
## Content: documents: 2
##
## [[1]]
## <<PlainTextDocument>>
## Metadata: 7
## Content: chars: 140570
##
## [[2]]
## <<PlainTextDocument>>
## Metadata: 7
## Content: chars: 176572
Generamos una función que limpia nuestro texto, ojo, replace_abbreviation del paquete qdap yo no lo puedo instalar por falta de version de Java en 32 bit, que es la configuración actual de mi R, a muchos si les va a jalar.
#Función de funciones de r base y tm
clean_corpus <- function(corpus){
corpus <- tm_map(corpus, stripWhitespace)
corpus <- tm_map(corpus, removePunctuation)
corpus <- tm_map(corpus, content_transformer(tolower))
#corpus <- tm_map(corpus, content_transformer(replace_abbreviation))
corpus <- tm_map(corpus, removeNumbers)
corpus <- tm_map(corpus, removeWords, c(stopwords("en"), "que"
,"los", "por","porque", "mas", "del", "the", "las", "para",
"con", "como", "entonces", "project", "and", "you", "sus",
"también", "todo", "les", "ellos", "this", "with", "había",
"todos", "tambien", "šus","vosotros", "gutenbergtm", "fue",
"dicho", "una", "uno", "entre", "este", "esto", "diziendo", "gutenberg"))
return(corpus)
}
… y limpiamos!
biblia_corpus <- clean_corpus(biblia_corpus)
R base y tm:
tolower(): Pasamos todo a minúsculas (Cuidado si se buscan nombre propios) (R base) removePunctuation(): Elimina puntuación (paquete tm) removeNumbers(): Elimina numeros (cuidado si se buscan cantindades) (paquete tm) stripWhitespace(): Quita espacios extra (paquete tm) removeWords(): Elimina palabras, muy útil combinarla con stopwords() (paquete tm)
Paquete qdap:
bracketX(): Elimina lo que esté entre paréntesis. replace_number(): Pasa los numeros a palabras (por ejemplo. «2» pasa a «two», tener en cuenta que el ejemplo se utiliza ingles) replace_abbreviation(): camba abreviaciones por la versión completa (por ejemplo «Sr» pasa a «Senior») replace_contraction(): Elimina contracciones (por ejemplo «can’t» pasa «can not») replace_symbol() Pasa símbolos a palabras (por ejemplo «@» pasa a «at»)
De la función para limpiar el corpus de arriba quizá lo mas interesante a destacar es eliminar las palabras comunes con removeWords(). Algunas líneas más adelante veremos la importancia de limpiar términos que no aportan información útil.
Vamos a obtener la frecuencia con la que aparecen los términos en la colección de documentos que tenemos, para ellos seguiremos los siguientes pasos:
Matriz por términos de documentos
biblia_tdm <- TermDocumentMatrix(biblia_corpus)
inspect(biblia_tdm)
## <<TermDocumentMatrix (terms: 6691, documents: 2)>>
## Non-/sparse entries: 7983/5399
## Sparsity : 40%
## Maximal term length: 22
## Weighting : term frequency (tf)
## Sample :
## Docs
## Terms 1602.txt 1909.txt
## dios 58 236
## dixo 107 0
## hijo 79 71
## hombre 77 65
## iešus 139 0
## jesús 0 271
## ley 9 93
## padre 68 147
## pues 47 79
## señor 61 98
Convertimos
biblia_m <- as.matrix(biblia_tdm)
head(biblia_m)
## Docs
## Terms 1602.txt 1909.txt
## ¡cuán 0 2
## ¡hosanna 0 1
## ¡maría 0 1
## ¡miserable 0 1
## ¡oh 0 1
## ¡rabboni 0 1
Sumamos las filas de cada versión de libro
biblia_words <- sort(rowSums(biblia_m), decreasing = T)
head(biblia_words)
## dios jesús padre señor hijo hombre
## 294 271 215 159 150 142
Obtenemos matriz de frecuencias por palabra
biblia_freq <- data.frame(terms = names(biblia_words), num = biblia_words)
head(biblia_freq)
## terms num
## dios dios 294
## jesús jesús 271
## padre padre 215
## señor señor 159
## hijo hijo 150
## hombre hombre 142
Hacemos nuestra fantastica imagen!
wordcloud(biblia_freq$terms, biblia_freq$num, max.words = 75, colors = c( "grey", "orange", "red"))
Comentamos que construiríamos modelos, para ellos existen algoritmos de texto muy poderosos, aquí uno muy bueno, from scratch, el famoso “Word2vec” usado en NLP: https://gist.github.com/primaryobjects/8038d345aae48ae48988906b0525d175
Sin embargo ya hay implementaciones buenísimas, con varios algoritmos y es oficial de R.
https://cran.r-project.org/web/packages/stringdist/index.html
De nuestra matriz biblia_freq, seleccionamos las palabras con una frecuencia mayor a 50:
biblia_freq2 <- biblia_freq %>%
filter(num>50)
Cargamos super libreria llena de algoritmos…
#install.packages("stringdist")
library(stringdist)
Obtenemos palabras unicas con mayor frecuencia y pasamos algoritmo Jaro-Winkler ó distancia winkler.
Nota.La libreria tiene algoritmos como el de Levenstein, Jaccard, qgram, coseno, entre otros.
uniquewords <- unique(as.character(biblia_freq2$terms))
distancewords <- stringdistmatrix(uniquewords,uniquewords,method = "jw")
Pasamos en un cluster de 20 grupos todas las palabras y generamos un dendograma con la funcion hclust
#Pasamos lista de unicas palabras
rownames(distancewords) <- uniquewords
#Graficamos por cluster
hc <- hclust(as.dist(distancewords))
plot(hc)
rect.hclust(hc,k=20)
No se olviden de leer esto para los interesados en texto, y si, es real el link!!! y si es el tidyverse para texto!!! Awsome!!!
https://www.tidytextmining.com/tidytext.html
20 minutos para un buen tutorial de REGEX
https://tutorialzine.com/2014/12/learn-regular-expressions-in-20-minutes
Herramienta para probar y depurar expresiones regulares.
OBJETIVO: Hacer presentes algunos temas de los muchos que existen en el universo de R y los datos
Los strings son cualquier valor que se encuentre entre comillas ó comillas sencillas. A estos valores R los trata como strings, se almacenan entre comillas aunque en la UI solo se vean comillas sencillas.
a <- 'Empieza y termina con comilla sencilla'
a
## [1] "Empieza y termina con comilla sencilla"
b <- "Empieza y termina con comillas"
b
## [1] "Empieza y termina con comillas"
c <- "Comilla sencilla ' en medio de comillas"
c
## [1] "Comilla sencilla ' en medio de comillas"
d <- 'Comillas " en medio de comilla sencilla al inicio y al final'
d
## [1] "Comillas \" en medio de comilla sencilla al inicio y al final"
Ejemplo de strings invalidos:
e <- 'Comillas mezcladas"
Resultado:
INCOMPLETE_STRING
f <- 'Una comilla sencilla ' dentro de otras comillas sencillas'
Resultado:
INCOMPLETE_STRING
g <- "Comillas " dentro de comillas dobles"
Resultado:
INCOMPLETE_STRING
Para concatenar strings usamos algo muy sencillo paste
a <- "D00"
b <- '1234'
c <- "2019 1"
print(paste(a,b,c))
## [1] "D00 1234 2019 1"
print(paste(a,b,c, sep = "-"))
## [1] "D00-1234-2019 1"
print(paste(a,b,c, sep = "", collapse = ""))
## [1] "D0012342019 1"
Para formatear los strings también usamos algo sencillo:
# Justificar a la Izquierda
cadena <- format("Cuota", width = 6, justify = "l")
cadena
## [1] "Cuota "
# Justificar al centro
cadena <- format("Cuota", width = 9, justify = "c")
cadena
## [1] " Cuota "
Podemos contar los caracteres de una oración con nchar()
cadena2 <- nchar("Prima Emitida en $ usd...")
cadena2
## [1] 25
Podemos cambiar a mayúsculas o minúsculas.
toupper(cadena)
## [1] " CUOTA "
tolower(cadena)
## [1] " cuota "
Por ultimo podemos hacer substrings más cortos de uno ya existente
# Extraer caracteres de la 5ta a la 7th posición
cadena3 <- substring("Ricardo Lastra", 5, 7)
cadena3
## [1] "rdo"
Adicional a R base pueden revisar la libreria stringr cuya sintaxis es muy amigable, esta dentro del universo Tidy que ya conocemos.
Pueden consultar el siguiente link https://cran.r-project.org/web/packages/stringr/vignettes/stringr.html
Son de las cosas que más dolores de cabeza les dan a algunos, sin embargo hay librerías que lo hacen sencillo, las fechas son difíciles de manejar por los formatos en los que cada sistema las almacena, este no depende de los sistemas, sino de la necesidad del usuario, de la zona horaria, y en algunos casos son solo días, meses o horas con minutos y segundos los que se necesitan.
Una magnifica libreria es lubridate la cual soporta instantes, intervalos, duraciones y periodos.
fecha <- Sys.Date()
fechas <- seq(fecha, length.out=12, by = "1 month")
fechas
## [1] "2019-07-04" "2019-08-04" "2019-09-04" "2019-10-04" "2019-11-04"
## [6] "2019-12-04" "2020-01-04" "2020-02-04" "2020-03-04" "2020-04-04"
## [11] "2020-05-04" "2020-06-04"
más ejemplos…
Accedemos al formato dd/mm/aaaa con la funcion dmy y obtenemos el mes de la fecha de nacimiento:
library(lubridate)
bday <- dmy("29/05/1986")
month(bday)
## [1] 5
Accedemos al día de la semana de ese año:
wday(bday, label = TRUE)
## [1] jue\\.
## 7 Levels: dom\\. < lun\\. < mar\\. < mié\\. < jue\\. < ... < sáb\\.
Y accedemos también al dia del año actual:
year(bday) <- 2019
wday(bday, label = TRUE)
## [1] mié\\.
## 7 Levels: dom\\. < lun\\. < mar\\. < mié\\. < jue\\. < ... < sáb\\.
Y en formato aaaa/mm/dd hr:min:seg con la funcion ymd_hms y obtenemos el mes de la fecha de esta forma:
time <- ymd_hms("2019-06-25 15:30:30")
time
## [1] "2019-06-25 15:30:30 UTC"
Funciones de ayuda para manipular time zones: with_tz(), force_tz()
# Changes printing
with_tz(time, "America/Chicago")
## [1] "2019-06-25 10:30:30 CDT"
# Changes time
force_tz(time, "America/Chicago")
## [1] "2019-06-25 15:30:30 CDT"
Cuando uno quiere analizar datos, regularmente necesita variables que funcionan como etiquetas. Estas etiquetas pueden ser contadas, pero no sumadas. A este tipo de variables se les conoce como variables categóricas y en R se llaman factores.
mascotas <- c("P", "G", "P", "P", "G", "P")
mascotas <- factor(mascotas)
mascotas
## [1] P G P P G P
## Levels: G P
mascotas <- factor(c("P", "G", "P", "P", "G", "P","G"), levels=c("G", "P"), labels=c("GATO", "PERRO"))
mascotas
## [1] PERRO GATO PERRO PERRO GATO PERRO GATO
## Levels: GATO PERRO
En el mundo visual, para tunnear nuestros graficos, la libreria “RColorBrewer” es una herramienta basica, contiene
#install.packages("RcolorBrewer")
library(RColorBrewer)
#create a sequential palette for usage and show colors
mypalette<-brewer.pal(7,"Greens")
image(1:7,1,as.matrix(1:7),col=mypalette,xlab="Tonos de Verde",
ylab="",xaxt="n",yaxt="n",bty="n")
## display a qualitative palette
display.brewer.pal(7,"Accent")
Mas información en: https://www.rdocumentation.org/packages/RColorBrewer/versions/1.1-2/topics/RColorBrewer
Algo muy util en programación orientada a objetos son las listas, son parecidas a los vectores, pero con una diferencia importante: pueden tener los elementos de diferentes tipos.
lista <- list(1, 2, 3, 4, 5)
lista
## [[1]]
## [1] 1
##
## [[2]]
## [1] 2
##
## [[3]]
## [1] 3
##
## [[4]]
## [1] 4
##
## [[5]]
## [1] 5
El operador de extracción ([), devuelve una lista
lista[1]
## [[1]]
## [1] 1
is.list(lista[1])
## [1] TRUE
is.vector(lista[1])
## [1] TRUE
El operador [[ devuelve un vector
lista[[1]]
## [1] 1
is.list(lista[[1]])
## [1] FALSE
is.vector(lista[[1]])
## [1] TRUE
Asi es como se ven los diferentes datos de
renta <- list(direccion="Masarik 306", m2=c(10, 15, 3), dlls.men=2500)
renta
## $direccion
## [1] "Masarik 306"
##
## $m2
## [1] 10 15 3
##
## $dlls.men
## [1] 2500
Existe otro operador de acceso: $
renta$dlls.men
## [1] 2500
renta[3]
## $dlls.men
## [1] 2500
renta[[2]]
## [1] 10 15 3
Otro tema muy importante para la manipulación y manejo de datos son formatos denominados tidy, es una abstracción de datos limpios, antes del concepto ya existian datos almacenados de esta forma, pero R nos brinda una serie de verbos ó funciones para convertirlos como queremos de una manera simple y sencilla.
Mas info revisen el siguiente artículo:
Asi los queremos:
Tidy Data
Se acomoda cada variable en una columna
Cada observación en un renglón
Y cada valor en una celda ó casilla.
¿Cómo podemos encontrar la información almacenada en el mundo de los datos?
Aquí algunos ejemplos:
| Lat | Long | Indicador | |
|---|---|---|---|
| Obs1 | # | # | # |
| lugar | indicador | |
|---|---|---|
| Obs 1 | ||
| Obs 2 |
| Fecha 1 | Fecha 2 | |
|---|---|---|
| lugar 1 | ||
| lugar 2 |
| Fecha 1 | Fecha 2 | … | |
|---|---|---|---|
| LUGAR 1 | |||
| Ind 1 | # | # | … |
| Ind 2 | # | # | … |
| LUGAR 2 | |||
| Ind 1 | # | # | … |
| Ind 2 | # | # | … |
Tablas que también existen en otro tipo de formatos:
| Indicador 1 | Indicador 2 |
|---|
| Fecha 1 | Fecha 2 | Fecha 1 | Fecha 2 | |
|---|---|---|---|---|
| lugar 1 | Ind 1 | Ind 1 | Ind 2 | Ind 2 |
| lugar 1 | Ind 1 | Ind 1 | Ind 2 | Ind 2 |
Otros ejemplos:
Usando tidyr se ve como sigue:
library(tidyr)
messy <- data_frame(nombre=c("juan.perez.lopez","martha.lopez.benitez",
"jesus.ramirez.perez","jose.martinez.lopez",
"aurora.saldivar.salazar"),
genero_edad=c("m.35","f.23","m.30","m.25","f.33"),
time=c(1,3,4,5,6))
messy
## # A tibble: 5 x 3
## nombre genero_edad time
## <chr> <chr> <dbl>
## 1 juan.perez.lopez m.35 1
## 2 martha.lopez.benitez f.23 3
## 3 jesus.ramirez.perez m.30 4
## 4 jose.martinez.lopez m.25 5
## 5 aurora.saldivar.salazar f.33 6
Tendríamos que dejarlo tidy:
semi_messy <- messy %>% separate(col=nombre, into=c("nombre",
"apellido_paterno",
"apellido_materno"),
sep="\\.")
semi_messy
## # A tibble: 5 x 5
## nombre apellido_paterno apellido_materno genero_edad time
## <chr> <chr> <chr> <chr> <dbl>
## 1 juan perez lopez m.35 1
## 2 martha lopez benitez f.23 3
## 3 jesus ramirez perez m.30 4
## 4 jose martinez lopez m.25 5
## 5 aurora saldivar salazar f.33 6
clean <- semi_messy %>% separate(col=genero_edad, into=c("genero","edad"),
sep="\\.")
clean
## # A tibble: 5 x 6
## nombre apellido_paterno apellido_materno genero edad time
## <chr> <chr> <chr> <chr> <chr> <dbl>
## 1 juan perez lopez m 35 1
## 2 martha lopez benitez f 23 3
## 3 jesus ramirez perez m 30 4
## 4 jose martinez lopez m 25 5
## 5 aurora saldivar salazar f 33 6
Otro ejemplo: ¿Qué está mal?
messy <- data_frame(pais=c(rep("Afganistan",4),
rep("Brazil",4),
rep("China",4)),
year=c(rep(1999,2),rep(2000,2),
rep(1999,2),rep(2000,2),
rep(1999,2),rep(2000,2)),
llave=c("casos","poblacion","casos","poblacion",
"casos","poblacion","casos","poblacion",
"casos","poblacion","casos","poblacion"),
valor=c(75,1300000,134,1400000,
10000,100000000,12000,120000000,
56000,150000000,60000,170000000))
messy
## # A tibble: 12 x 4
## pais year llave valor
## <chr> <dbl> <chr> <dbl>
## 1 Afganistan 1999 casos 75
## 2 Afganistan 1999 poblacion 1300000
## 3 Afganistan 2000 casos 134
## 4 Afganistan 2000 poblacion 1400000
## 5 Brazil 1999 casos 10000
## 6 Brazil 1999 poblacion 100000000
## 7 Brazil 2000 casos 12000
## 8 Brazil 2000 poblacion 120000000
## 9 China 1999 casos 56000
## 10 China 1999 poblacion 150000000
## 11 China 2000 casos 60000
## 12 China 2000 poblacion 170000000
Lo deberíamos arreglar con:
clean <- messy %>% spread(key=llave, value=valor, fill=NA)
clean
## # A tibble: 6 x 4
## pais year casos poblacion
## <chr> <dbl> <dbl> <dbl>
## 1 Afganistan 1999 75 1300000
## 2 Afganistan 2000 134 1400000
## 3 Brazil 1999 10000 100000000
## 4 Brazil 2000 12000 120000000
## 5 China 1999 56000 150000000
## 6 China 2000 60000 170000000
El último
stocks <- data_frame(
time = as.Date('2009-01-01') + 0:9,
X = rnorm(10, 0, 1),
Y = rnorm(10, 0, 2),
Z = rnorm(10, 0, 4)
)
stocks
## # A tibble: 10 x 4
## time X Y Z
## <date> <dbl> <dbl> <dbl>
## 1 2009-01-01 2.32 2.52 6.02
## 2 2009-01-02 -0.577 1.01 -1.81
## 3 2009-01-03 -0.708 3.54 6.24
## 4 2009-01-04 1.04 -1.11 4.07
## 5 2009-01-05 0.264 -1.48 0.170
## 6 2009-01-06 1.84 1.39 3.42
## 7 2009-01-07 -1.63 2.15 -2.70
## 8 2009-01-08 0.391 -2.00 0.772
## 9 2009-01-09 -1.37 2.54 -2.71
## 10 2009-01-10 -0.0623 -1.99 8.62
stocks %>% gather(stock, price, -time)
## # A tibble: 30 x 3
## time stock price
## <date> <chr> <dbl>
## 1 2009-01-01 X 2.32
## 2 2009-01-02 X -0.577
## 3 2009-01-03 X -0.708
## 4 2009-01-04 X 1.04
## 5 2009-01-05 X 0.264
## 6 2009-01-06 X 1.84
## 7 2009-01-07 X -1.63
## 8 2009-01-08 X 0.391
## 9 2009-01-09 X -1.37
## 10 2009-01-10 X -0.0623
## # ... with 20 more rows
i) Shiny
ii) Simulación
iii) Scrapping
iv) Algoritmos de ML
v) Creando un paquete
vi) Paralelo
vii) API´s
i) Git
ii) Spark
iii) SQLite, JS, C
iv) Docker
v) Bash programming, paralelo
vi) AWS (Amazon cloud services)
Muchas gracias!!!
15 librerías.
A work by Ricardo Lastra
ricardolcuevas@gmail.com